package cn.duli.xianer.dao;


import cn.duli.xianer.pojo.Goods;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

public interface GoodsMapper {

    // 新增商品
    int save(Goods goods);

    // 修改商品
    void update(Goods goods);

    // 根据id查找此商品基本信息
    Goods findById(@Param("gId") Integer gId);

    // 根据id删除此商品
    void deleteById(@Param("gId") Integer gId);

    // 根据id取消删除的商品(回收站回收某个商品)
    void cancelDeleteById(@Param("gId") Integer gId);



    // 根据id下架此商品
    void shelveById(@Param("gId") Integer gId);

    // 根据id取消被下架的商品（上架）
    void cancelShelveById(@Param("gId") Integer gId);

    // 根据用户id查询该用户下架的商品列表
    Page<Goods> findShelveByUserId(@Param("gUid") Integer gUid);

    // 根据用户id查询该用户审核中的商品列表
    Page<Goods> findVerifyIngByUid(@Param("gUid") Integer gUid);

    // 根据用户id查询该用户审核失败的商品列表
    Page<Goods> findDieVerifyByUid(@Param("gUid") Integer gUid);

    // 分页查询所有审核中的商品列表
    Page<Goods> findAllVerifyIng();

    // 分页查询所有审核失败的商品列表
    Page<Goods> findDieVerify();

    // 分页查询所有正常售卖的商品列表
    Page<Goods> findSellIng();

    // 分页查询所有下架了的商品列表
    Page<Goods> findShelved();

    // 根据商品id修改此商品的审核状态
    void updateMode(Goods goods);

    // 根据用户id查询此用户发布成功的商品列表（所有审核状态为1正常的商品）
    Page<Goods> findByUserId(@Param("gUid") Integer gUid);

    // 分页查询所有商品(所有状态)
    Page<Goods> findAll();

    // 分页根据商品名称模糊查询商品列表
    Page<Goods> queryLikeByGoodName(@Param("gName") String gName);

    // 分页根据类别名模糊查询商品列表
    Page<Goods> queryLikeByTypeName(@Param("tName") String tName);

    // 分页根据发布地点查询商品列表
    Page<Goods> queryLikeByAddr(@Param("gAddr") String gAddr);

    // 分页根据时间区间动态查询发布的商品列表
    Page<Goods> queryByTimeInterval(@Param("startTime") String startTime, @Param("endTime") String endTime);

    // 分页根据二级类别id查询该类别下的商品列表
    Page<Goods> queryByTypeTwoLevelId(@Param("tId") Integer tId);

    // 根据商品id修改此商品浏览量
    void updateViewNum(Goods goods);

    // 根据时间区间、价格区间、商品成色、类别动态分页查询商品列表
    Page<Goods> queryDynamic(@Param("startTime") String startTime, @Param("endTime") String endTime,
                             @Param("lowPrice") String lowPrice, @Param("topPrice") String topPrice,
                             @Param("gLevel") String gLevel, @Param("gTid") String gTid);

    // 查询商品表里面的所有成色
    List<Goods> findGlevel();

    // 查询浏览量最多的前8条数据
    List<Goods> topByViewNum();

    // 查询最新上架的前4条数据
    List<Goods> topNewTime();

    // 根据用户id查询此用户发布的所有商品列表
    List<Goods> findAllByUserId(@Param("gUid") Integer gUid);

    // 查找商品总数
    int findGoodsCount();


    // 推荐算法中，先查询set中的元素，再查询(3-end的长度)个元素 - 前提：元素不能存在于end中；不能是用户当前购买的商品
    // gId是当前购买的商品id
    List<Goods> findRecommend(@Param("set")Set<Integer> set, @Param("gId")Integer gId, @Param("count")Integer count);

    // 根据商品id批量查找商品列表
    List<Goods> findByIds(@Param("ids")Set<Integer> ids);

    // 根据时间区间动态查询发布的商品列表
    List<Goods> queryByTimeIntervalTwo(@Param("startTime") String startTime, @Param("endTime") String endTime);

}